// 给定一个二叉树和一个目标和，判断该树中是否存在根节点到叶子节点的路径，这条路径上所有节点值相加等于目标和。
// 说明: 叶子节点是指没有子节点的节点。

// 暴露接口
function hasPathSum(root: TreeNode | null, sum: number): boolean {
  if (root == null) return false;// 边界情况走到了空节点，直接返回false
  sum = sum - root.val;// 非空节点减去当前节点值
  if (root.left == null && root.right == null) return sum === 0;// 当前节点为叶子节点时，判断sum值即可
  return hasPathSum(root.left, sum) || hasPathSum(root.right, sum);// 对左右子树进行遍历
}

// 这道题目的难度并不大，主要考察的是深度优先遍历和叶节点的性质
// 但也有几个要注意的地方，
// 第一是如何判断此时已经到达了叶节点，显然当到达叶节点时
// 节点的左右子树均为空，左右子树有任意为非空的情况下，都说明当前节点不是叶节点
// 所以显然此时的判断是不算数的，应该继续往下遍历
// 处理sum值的方法也比较直白，每当走到一个节点，用sum减去当前节点的值即可
// 然后来思考深度优先递归遍历的出口：
// 1、最舒服的情况是直接走到叶节点，走到叶节点了直接判断当前的sum值是否为0即可
// 2、在一些边界情况，可能出现树的某分叉左右不对等的情况，即某一分支可能走向空节点但另一分支还没走到叶节点
// 在这种情况下显然走向空节点这一分支的判断是不算数的，应该直接返回false
// 递归的处理上直接用||运算给左右子树即可